home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / lib / posix / readdir.c < prev    next >
C/C++ Source or Header  |  1990-07-19  |  1KB  |  40 lines

  1. /* readdir -- read next entry from a directory stream    Author: D.A. Gwyn */
  2.  
  3. /*    last edit:    25-Apr-1987    D A Gwyn    */
  4.  
  5. #include <lib.h>
  6. #include <dirent.h>
  7. #include <stddef.h>
  8.  
  9. extern int getdents();        /* SVR3 system call, or emulation */
  10.  
  11. #define DULL (DIR *) NULL
  12. #define CULL (char *) NULL
  13.  
  14. struct dirent *readdir(dirp)
  15. register DIR *dirp;        /* stream from opendir() */
  16. {
  17.   register struct dirent *dp;    /* -> directory data */
  18.  
  19.   if (dirp == DULL || dirp->dd_buf == CULL || dirp->dd_magic != _DIR_MAGIC) {
  20.     errno = EBADF;
  21.     return( (struct dirent *) NULL);    /* invalid pointer */
  22.   }
  23.  
  24.   do {
  25.     if (dirp->dd_loc >= dirp->dd_size)    /* empty or obsolete */
  26.         dirp->dd_loc = dirp->dd_size = 0;
  27.  
  28.     if (dirp->dd_size == 0    /* need to refill buffer */
  29.         && (dirp->dd_size =
  30.          getdents(dirp->dd_fd, dirp->dd_buf, (unsigned) _DIRBUF)) <= 0)
  31.         return((struct dirent *) NULL);    /* EOF or error */
  32.  
  33.     dp = (struct dirent *) & dirp->dd_buf[dirp->dd_loc];
  34.     dirp->dd_loc += dp->d_reclen;
  35.   }
  36.   while (dp->d_ino == 0);    /* don't rely on getdents() */
  37.  
  38.   return(dp);
  39. }
  40.